home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_gnats.idb / usr / freeware / lib / gnats / contrib / tkgnats / tkprfolder.t.z / tkprfolder.t
Encoding:
Text File  |  1999-04-16  |  4.7 KB  |  200 lines

  1. #
  2. # $Id: tkprfolder.t,v 1.2 1993/11/16 22:19:37 jason Exp $
  3. #
  4. # TkGnats PR folders module
  5. #
  6.  
  7. #
  8. # -- globals
  9. #
  10. set Tkprfolder(dir) "[glob ~]/TkGnats/folders"
  11. set Tkprfolder(foldernameregexp) {^[a-zA-z0-9]+[a-zA-Z0-9_.]*}
  12.  
  13. proc tkprfolder_checkdirs {args} {
  14.     foreach d $args {
  15.     set d [glob $d]
  16.     if {![file isdirectory $d]} {
  17.         if {[catch {exec mkdir $d} x]} {
  18.         Msg "Error creating directory $d" "'$x'"
  19.         return -1
  20.         }
  21.     }
  22.     }
  23.     return 0
  24. }
  25.  
  26. proc tkprfolder_button_cmd {cmd top lbox} {
  27.     global Tkprfolder
  28.     if {"$cmd" == "Exit"} {
  29.     destroy $top
  30.     return
  31.     }
  32.     if {"$cmd" == "New"} {
  33.     tkprfolder_new $top
  34.     return
  35.     }
  36.     # get the selected item (if there is one)
  37.     set x  [$lbox curselection]
  38.     if {"$x" == ""} {
  39.     Msg "No selection availble in the folder list box"
  40.     return
  41.     }
  42.     set idx [lindex $x 0]
  43.     set folder [$lbox get $idx]
  44.     if {"$cmd" == "Query"} {
  45.     set prlist {}
  46.     foreach p [split [exec cat $folder] "\t\n "] {
  47.         if {"$p" != ""} {
  48.         lappend prlist $p
  49.         }
  50.     }
  51.     query_cmd $prlist
  52.     return
  53.     }
  54.     if {"$cmd" == "Rename"} {
  55.     set newname \
  56.         [exec entryDialog "Enter new name for \n[exec basename $folder]"]
  57.     if {"$newname" == ""} {
  58.         return
  59.     }
  60.     if {![regexp $Tkprfolder(foldernameregexp) $newname]} {
  61.         Msg "Folder names must be composed only of" \
  62.         "letters numbers underscores and periods"
  63.         return
  64.     }
  65.     exec mv $folder $Tkprfolder(dir)/$newname
  66.     tkprfolder_resync $top
  67.     return
  68.     }
  69.     if {"$cmd" == "Delete"} {
  70.     if {"$folder" == "$Tkprfolder(dir)/Backup--Folder"} {
  71.         Msg "You are not allowed to delete $folder"
  72.         return
  73.     }
  74.     exec mv $folder $Tkprfolder(dir)/Backup--Folder
  75.     tkprfolder_resync $top
  76.     return
  77.     }
  78.     if {"$cmd" == "Edit"} {
  79.     if {"$folder" == "$Tkprfolder(dir)/Backup--Folder"} {
  80.         Msg "You are not allowed to edit $folder"
  81.         return
  82.     }
  83.     exec cp $folder $Tkprfolder(dir)/Backup--Folder
  84.     tkprfolder_edit $folder $top
  85.     return
  86.     }
  87.     Msg "tkprfolder_button_cmd:" "do not understand the $cmd operation"
  88. }
  89.  
  90. proc tkprfolder_edit_Cancel {top txt fname flisttop} {
  91.     destroy $top
  92. }
  93. proc tkprfolder_edit_Write {top txt fname flisttop} {
  94.     exec cat << [$txt get 1.0 end] > $fname
  95.     destroy $top
  96.     tkprfolder_resync $flisttop
  97. }
  98.  
  99. proc tkprfolder_resync {flisttop} {
  100.     if {[winfo exists $flisttop]} {
  101.     tkprfolder_dialog $flisttop
  102.     }
  103. }
  104.  
  105. proc tkprfolder_edit {fname flisttop} {
  106.     set f .tkprfolder_edit_file
  107.     if {[winfo exists $f]} {
  108.     Msg "You are can only edit one folder at a time"
  109.     return
  110.     }
  111.     toplevel $f
  112.     frame $f.buttons
  113.     foreach x {Cancel Write} {
  114.     button $f.buttons._$x -text $x \
  115.         -command "tkprfolder_edit_$x $f $f.text $fname $flisttop"
  116.     pack append $f.buttons $f.buttons._$x {left padx 8}
  117.     }
  118.     scrollbar $f.sb -command "$f.text yview" -relief sunken
  119.     text $f.text \
  120.     -font fixed \
  121.     -yscrollcommand "$f.sb set" \
  122.     -height 15 -width 40 -relief sunken -padx 4 -insertwidth 1 \
  123.     -insertofftime 400 -borderwidth 2
  124.     bind $f.text <Enter> "+focus $f.text"
  125.     bind $f.text <Control-g> {
  126.     set s [prid_from_selection]
  127.     if {"$s" != ""} {
  128.         %W insert 1.0 "$s\n"
  129.     }
  130.     }
  131.  
  132.     pack append $f \
  133.     $f.buttons {bottom} \
  134.     $f.sb {left filly} \
  135.     $f.text {right expand fill}
  136.     if {[file exists $fname]} {
  137.     $f.text insert 1.0 [exec cat $fname]
  138.     }
  139.     wm title $f "Tkprfolder: [exec basename $fname]"
  140. }
  141.  
  142.  
  143. proc tkprfolder_new {flisttop} {
  144.     global Tkprfolder
  145.     set fname [exec entryDialog "Enter name of folder file"]
  146.     if {"$fname" == ""} {
  147.     return
  148.     }
  149.     if {![regexp $Tkprfolder(foldernameregexp) $fname]} {
  150.     Msg "Folder names must be composed only of" \
  151.         "letters numbers underscores and periods"
  152.     return
  153.     }
  154.     tkprfolder_edit $Tkprfolder(dir)/$fname $flisttop
  155. }
  156.  
  157. proc tkprfolder_cmd {cmd w y} {
  158.     set idx [$w nearest $y]
  159.     set fname [$w get $idx]
  160.     query_cmd [split [exec cat $fname] " \n\t"]
  161. }
  162.  
  163. proc tkprfolder_dialog {w} {
  164.     global Tkprfolder
  165.     if {[tkprfolder_checkdirs ~/TkGnats $Tkprfolder(dir)] < 0} {
  166.     return
  167.     }
  168.     # first get the list of folders for this person
  169.     set folder_list {}
  170.     catch {[set folder_list [glob $Tkprfolder(dir)/*]]}
  171.  
  172.     if {[winfo exists $w]} {
  173.     $w.list delete 0 end
  174.     } else {
  175.     toplevel $w
  176.  
  177.     message $w.msg -anchor w -text "Folders" -aspect 10000
  178.     scrollbar $w.sb \
  179.         -borderwidth 2 -relief sunken \
  180.         -command "$w.list yview"
  181.     listbox $w.list -yscroll "$w.sb set" \
  182.         -setgrid 1 \
  183.         -relief sunken -borderwidth 2 \
  184.         -geometry 40x8
  185.     tk_listboxSingleSelect $w.list
  186.     frame $w.buttons
  187.     foreach x {Edit Query Delete Rename New Exit} {
  188.         button $w.buttons._$x -text $x \
  189.         -command "tkprfolder_button_cmd $x $w $w.list"
  190.         pack append $w.buttons $w.buttons._$x {left padx 8}
  191.     }
  192.     pack append $w \
  193.         $w.buttons {bottom} \
  194.         $w.msg {top fillx} \
  195.         $w.sb {left filly} \
  196.         $w.list {right expand fillx}
  197.     }
  198.     eval $w.list insert end $folder_list
  199. }
  200.